package com.ftg.learn.chapter12;

import java.util.*;
import java.util.function.BiFunction;

/**
 * 学习使用图  map
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/2/10 上午10:12
 */
public class LearnMap {

    public static void main(String[] args) {
//        jdk1.5 以前 hashmap 数组  hashmap 生成 下标的时候 key的.hashcode(); 不同的key取到相同的下标
//        jdk1.8 以前 数组 + 链表  当key冲突时，采用单链式存储 ,新的问题来了 hashmap数据量大的时候遍历速度慢、查找也慢
//        jdk1.8 以后  [数组]+[链表(单向)]+[红黑树]
        Map<String, String> map = new HashMap<>();

        //HashMap 无序实现类
        map.put("name", "康加修");
        map.put("sex", "男");

        System.out.println(map.get("name"));

        //遍历 IBM 面试 ... IBM(....) || 电话

        // Api map<k,v> 遍历 ....  三种遍历方式
        System.out.println("直接取出map当中所有value");
        //帮我们把一个collection集合，里面直接存储了大量的value
        Collection<String> c = map.values();
        for (String item : c) {
            System.out.println(item);
        }

        System.out.println(map);

        System.out.println("第二种先取出所有key，再通过key取值方式");
        //返回当前map里面的所有key,返回类型为Set : 里面不可以存储相同的内容
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println("key为=" + key + "：对应的value为=" + map.get(key));
        }

        System.out.println("迭代器");
        Iterator<String> it = keys.iterator();
        while (it.hasNext()) {
            //key
            String key = it.next();
            System.out.println("key为=" + key + "：对应的value为=" + map.get(key));
        }

        System.out.println("for + 迭代器");
        for (Iterator<String> it1 = keys.iterator(); it1.hasNext(); ) {
            String key = it1.next();
            System.out.println("key为=" + key + "：对应的value为=" + map.get(key));
        }

        System.out.println("lambda");
        keys.forEach(x -> {
            System.out.println("key为=" + x + "：对应的value为=" + map.get(x));
        });

        System.out.println("第三种遍历方式  -- 直接使用内部类 (推荐)");
        Set<Map.Entry<String, String>> sets1 = map.entrySet();
        for (Map.Entry<String, String> kav : sets1) {
            System.out.println("key为=" + kav.getKey() + "：对应的value为=" + kav.getValue());
        }

        List<Map<String,String>> list = new ArrayList<>();

        //一个学生
        Map<String,String> stu1 = new HashMap<>();
        //一个学生的一个信息对
        stu1.put("name","张三");
        stu1.put("sex","男");
        //......
        list.add(stu1);

        stu1 = new HashMap<>();
        //一个学生的一个信息对
        stu1.put("name","李四");
        stu1.put("sex","女");
        //......
        list.add(stu1);

        System.out.println(list);

        System.out.println(list.get(0).get("name"));

        int i = 1;
        for (Map<String, String> stus : list) {
            System.out.println("第"+ i++ +"学生的信息姓名为"+ stus.get("name")+"性别"+stus.get("sex"));
        }

        //随机数的问题
        Map<Integer,Object> randNum = new HashMap<>();
//        1-5不重复的三个随机数
        while(randNum.size() < 3){
            int num = (int)(Math.random() * 5 + 1);
            randNum.put(num,"a");
        }
        System.out.println(randNum);
        //hashmap key也可以为null value 可以为null
        System.out.println(randNum.containsKey(3));
        System.out.println(randNum.containsValue(null));

        Map<String,String> stu2 = new HashMap<>();
        stu2.put(null,"a");
        stu2.put("name","张三");

        //....
        stu2.put("name","李四");

//        stu2.remove(null);
        stu2.remove("name","张三");
        System.out.println(stu2);



        stu2.replace("name",null);
        stu2.replace("name","张三","王艾绒");

        stu2.putIfAbsent("name","王二小");

        stu2.forEach((x,y)-> System.out.println(x+"=="+y));

//
//        Map<String,String> stu3 = new Hashtable<>();
//        stu3.put(null,"a");
//        System.out.println(stu3.get(null));
//        randNum.put(2,null);
//
//        if(!randNum.containsKey(2)){
//            randNum.put(2,null);
//
//        }
//
//        for (int i1 = 0; i1 < 10; i1++) {
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//            System.out.println(i1);
//        }
        Map<String,String> maps = new HashMap<>();
        maps.put("name","张aaa");

        maps.compute("name",(x,y)-> {
            StringBuilder stringBuilder = new StringBuilder(y);
            System.out.println(y.indexOf("张"));
            stringBuilder.setCharAt(y.indexOf("张"),'李');
            return stringBuilder.toString();
        });
        System.out.println(maps);


//        maps.merge("name", "王二小", new BiFunction<String, String, String>() {
//            @Override
//            public String apply(String s, String s2) {
//                System.out.println(s);
//                System.out.println(s2);
//                if (s.startsWith("张")) {
//                    return s;
//                }else{
//                    return s2;
//                }
////                return "李四";
//            }
//        });

        System.out.println(maps);

//        String s1 = "FB";
//        String s2 = "Ea";
//
//        System.out.println(s1.hashCode());
//        System.out.println(s2.hashCode());

        // 1 : 红黑树大小问题  排序 (... hashcode()  key != key1 ---> ?)
        // 2 :     可以将存储箱树化的最小表容量。（否则，如果容器中的节点太多，则会调整表的大小。）至少应为4*TREEIFY_THRESHOLD，以避免调整大小和树化阈值之间的冲突
        //    static final int MIN_TREEIFY_CAPACITY = 64;  到底表示什么意思 ?  [] > 64 (树化) - (node > 8 red/balck < 6 node)

        maps.merge("ss","sss",(x,y)->null);

        //4  16


    }

}
